package src.com.util;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

import java.io.*;
import java.sql.*;
import java.util.TimeZone;
import java.util.logging.Logger;

public class DBOmanagerData  {
    public static final String DRIVETR = "com.mysql.jdbc.Driver";
    public static final String USER = "root";
    public static final String PASS = "0000";
    public static final String URL = "jdbc:mysql://192.168.1.110:3306/CRAI";

    private static DBOmanagerData per = null;
    private Connection conn = null;
    private PreparedStatement ps = null;


    public static DBOmanagerData createInstance(){
        if(per == null){
            per = new DBOmanagerData();
            per.initDB();
        }
        return per;
    }

    public void initDB(){
        try {
            Class.forName(DRIVETR);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public void getConn(){
        try {
            conn = DriverManager.getConnection(URL,USER,PASS);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void closeDB(){
        try {
            if(ps!=null)
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(conn!=null)
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //增删改
    public int execueUpdate(String sql){
        int result = 0;
        try {
            result = ps.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }

    public PreparedStatement createPrepareStatement(String sql){
        try {
            ps = conn.prepareStatement(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ps;
    }

    /**
     * Created by admin on 2019/1/11.
     */
    public static class utilFtpAllFile {
        private FTPClient ftpClient;
        private String strIp;
        private int intPort;
        private String user;
        private String password;

        private static Logger logger = Logger.getLogger(utilFtpAllFile.class.getName());

        public static void main(String[] args) throws IOException {
            utilFtpAllFile ftp=new utilFtpAllFile("192.168.1.103",21,"wit","0000");
            ftp.ftpLogin();
            System.out.println("1");
            //上传文件夹
           // boolean uploadFlag = ftp.uploadDirectory("D:\\test", "admin/"); //如果是admin/那么传的就是所有文件，如果只是/那么就是传文件夹
           // System.out.println("uploadFlag : " + uploadFlag);
            //下载文件夹
            ftp.downLoadDirectory("D:/Postgraduate/Project/BRAI/code/images", "/home/wit/share/save1save");
            ftp.ftpLogOut();
        }

        /**
         * @return 判断是否登入成功
         * */
        public boolean ftpLogin() {
            boolean isLogin = false;
            FTPClientConfig ftpClientConfig = new FTPClientConfig();
            ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID());
            this.ftpClient.setControlEncoding("GBK");
            this.ftpClient.configure(ftpClientConfig);
            try {
                if (this.intPort > 0) {
                    this.ftpClient.connect(this.strIp, this.intPort);
                }else {
                    this.ftpClient.connect(this.strIp);
                }
                // FTP服务器连接回答
                int reply = this.ftpClient.getReplyCode();
                if (!FTPReply.isPositiveCompletion(reply)) {
                    this.ftpClient.disconnect();
                    System.out.println("登录FTP服务失败！");
                    return isLogin;
                }
                this.ftpClient.login(this.user, this.password);
                // 设置传输协议
                this.ftpClient.enterLocalPassiveMode();
                this.ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
                System.out.println("恭喜" + this.user + "成功登陆FTP服务器");
                isLogin = true;
            }catch (Exception e) {
                e.printStackTrace();
                System.out.println(this.user + "登录FTP服务失败！" + e.getMessage());
            }
            this.ftpClient.setBufferSize(1024 * 2);
            this.ftpClient.setDataTimeout(30 * 1000);
            return isLogin;
        }

        /**
         * @退出关闭服务器链接
         * */
        public void ftpLogOut() {
            if (null != this.ftpClient && this.ftpClient.isConnected()) {
                try {
                    boolean reuslt = this.ftpClient.logout();// 退出FTP服务器
                    if (reuslt) {
                        System.out.println("成功退出服务器");
                    }
                }catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("退出FTP服务器异常！" + e.getMessage());
                }finally {
                    try {
                        this.ftpClient.disconnect();// 关闭FTP服务器的连接
                    }catch (IOException e) {
                        e.printStackTrace();
                        System.out.println("关闭FTP服务器的连接异常！");
                    }
                }
            }
        }

        /***
         * 上传Ftp文件
         * @param localFile 当地文件
         * @param romotUpLoadePath 上传服务器路径 - 应该以/结束
         * */
        public boolean uploadFile(File localFile, String romotUpLoadePath) {
            BufferedInputStream inStream = null;
            boolean success = false;
            try {
                this.ftpClient.changeWorkingDirectory(romotUpLoadePath);// 改变工作路径
                inStream = new BufferedInputStream(new FileInputStream(localFile));
                System.out.println(localFile.getName() + "开始上传.....");
                success = this.ftpClient.storeFile(localFile.getName(), inStream);
                if (success == true) {
                    System.out.println(localFile.getName() + "上传成功");
                    return success;
                }
            }catch (FileNotFoundException e) {
                e.printStackTrace();
                System.out.println(localFile + "未找到");
            }catch (IOException e) {
                e.printStackTrace();
            }finally {
                if (inStream != null) {
                    try {
                        inStream.close();
                    }catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return success;
        }

        /***
         * 下载文件
         * @param remoteFileName   待下载文件名称
         * @param localDires 下载到当地那个路径下
         * @param remoteDownLoadPath remoteFileName所在的路径
         * */

        public boolean downloadFile(String remoteFileName, String localDires,String remoteDownLoadPath) {
            String strFilePath = localDires + remoteFileName;
            BufferedOutputStream outStream = null;
            boolean success = false;
            try {
                this.ftpClient.changeWorkingDirectory(remoteDownLoadPath);
                outStream = new BufferedOutputStream(new FileOutputStream(strFilePath));
                System.out.println(remoteFileName + "开始下载....");
                success = this.ftpClient.retrieveFile(remoteFileName, outStream);
                if (success == true) {
                    System.out.println(remoteFileName + "成功下载到" + strFilePath);
                    return success;
                }
            }catch (Exception e) {
                e.printStackTrace();
                System.out.println(remoteFileName + "下载失败");
            }finally {
                if (null != outStream) {
                    try {
                        outStream.flush();
                        outStream.close();
                    }catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            if (success == false) {
                System.out.println(remoteFileName + "下载失败!!!");
            }
            return success;
        }

        /***
         * @上传文件夹
         * @param localDirectory
         *            当地文件夹
         * @param remoteDirectoryPath
         *            Ftp 服务器路径 以目录"/"结束
         * */
        public boolean uploadDirectory(String localDirectory,
                                       String remoteDirectoryPath) {
            File src = new File(localDirectory);
            try {
                remoteDirectoryPath = remoteDirectoryPath + src.getName() + "/";
                boolean makeDirFlag = this.ftpClient.makeDirectory(remoteDirectoryPath);
                System.out.println("localDirectory : " + localDirectory);
                System.out.println("remoteDirectoryPath : " + remoteDirectoryPath);
                System.out.println("src.getName() : " + src.getName());
                System.out.println("remoteDirectoryPath : " + remoteDirectoryPath);
                System.out.println("makeDirFlag : " + makeDirFlag);
                // ftpClient.listDirectories();
            }catch (IOException e) {
                e.printStackTrace();
                System.out.println(remoteDirectoryPath + "目录创建失败");
            }
            File[] allFile = src.listFiles();
            for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
                if (!allFile[currentFile].isDirectory()) {
                    String srcName = allFile[currentFile].getPath().toString();
                    uploadFile(new File(srcName), remoteDirectoryPath);
                }
            }
            for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
                if (allFile[currentFile].isDirectory()) {
                    // 递归
                    uploadDirectory(allFile[currentFile].getPath().toString(),
                            remoteDirectoryPath);
                }
            }
            return true;
        }

        /***
         * @下载文件夹
         * @param localDirectoryPath 本地地址
         * @param remoteDirectory 远程文件夹
         * */
        public boolean downLoadDirectory(String localDirectoryPath,String remoteDirectory) {
            try {
                String fileName = new File(remoteDirectory).getName();
                localDirectoryPath = localDirectoryPath + fileName + "//";
                new File(localDirectoryPath).mkdirs();
                FTPFile[] allFile = this.ftpClient.listFiles(remoteDirectory);
                for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
                    if (!allFile[currentFile].isDirectory()) {
                        if(allFile[currentFile].getName().endsWith(".png")){
                            downloadFile(allFile[currentFile].getName(),localDirectoryPath, remoteDirectory);
                        }
                    }
                }
                for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
                    if (allFile[currentFile].isDirectory()) {
                        String strremoteDirectoryPath = remoteDirectory + "/"+ allFile[currentFile].getName();
                        downLoadDirectory(localDirectoryPath,strremoteDirectoryPath);
                    }
                }
            }catch (IOException e) {
                e.printStackTrace();
                System.out.println("下载文件夹失败");
                return false;
            }
            return true;
        }
        // FtpClient的Set 和 Get 函数
        public FTPClient getFtpClient() {
            return ftpClient;
        }
        public void setFtpClient(FTPClient ftpClient) {
            this.ftpClient = ftpClient;
        }
        /* *
         * Ftp构造函数
         */
        public utilFtpAllFile(String strIp, int intPort, String user, String Password) {
            this.strIp = strIp;
            this.intPort = intPort;
            this.user = user;
            this.password = Password;
            this.ftpClient = new FTPClient();
        }

    }
}
